package stack_queue

type DoubleLinkList struct {
	Head *Node
	Tail *Node
}

type Node struct {
	Val interface{}
	Pre *Node
	Next *Node
}

func (d *DoubleLinkList) AddFromHead(val int){
	cur := &Node{Val: val}
	if d.Head == nil {
		d.Head = cur
		d.Tail = cur
	} else {
		cur.Next = d.Head
		d.Head.Pre = cur
		d.Head = cur
	}
}

func (d *DoubleLinkList) AddFromTail(val int){
	cur := &Node{Val: val}
	if d.Head == nil {
		d.Head = cur
		d.Tail = cur
	} else {
		d.Tail.Next = cur
		cur.Pre = d.Tail
		d.Tail = cur
	}
}

func (d *DoubleLinkList) PullFromHead() interface{} {
	if d.Head == nil {
		return nil
	} else {
		res := d.Head
		if d.Head == d.Tail {
			d.Head = nil
			d.Tail = nil
			return res.Val
		}
		d.Head = d.Head.Next
		d.Head.Pre = nil
		return res.Val
	}
}

func (d *DoubleLinkList) PullFromTail() interface{} {
	if d.Tail == nil {
		return nil
	} else {
		res := d.Tail
		if d.Head == d.Tail {
			d.Head = nil
			d.Tail = nil
			return res.Val
		}
		d.Tail = d.Tail.Pre
		d.Tail.Next = nil
		return res.Val
	}
}

func (d *DoubleLinkList)IsEmpty() bool {
	return d.Head == nil
}
